package com.epkursant.testy;

import java.util.Date;
import java.util.List;

import com.ep.general.ActionSupportCustom;
import com.ep.general.kursant.Kursant;
import com.epkursant.app.login.LoginRequred;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

public class TestAction extends ActionSupportCustom<Test> implements
		LoginRequred {

	private static final long serialVersionUID = -4999682551321478515L;
	private TestMdt testMdt;
	private TestForm form;
	private String jsonOdp;
	private TestyWynikiMdt testyWynikiMdt;

	@Override
	public String execute() throws Exception {
		return SUCCESS;
	}

	public String list() {
		setDataArray(new TestView().getData());
		return DATA_ARRAY;
	}

	public String listWyniki() {
		Kursant kursant = (Kursant) getSession().get(LOGGED_USER);
		setDataArray(new TestView().getDataWyniki(kursant));

		return DATA_ARRAY;
	}

	public String result() {
		// podliczanie punktów
		int punkty = 0;
		String odp = getJsonOdp();
		List<Test> bazaOdp = getTestMdt().getList();

		JsonElement jelement = new JsonParser().parse(odp);
		JsonArray jarray = jelement.getAsJsonArray();

		// obliczamy il punktow zdobyl kursant
		punkty = obliczIlePtZdobyl(jarray, bazaOdp);

		// zapis do bazy
		Kursant kursant = (Kursant) getSession().get(LOGGED_USER);

		TestyWyniki testyWyniki = new TestyWyniki();
		testyWyniki.setData(new Date());
		testyWyniki.setKursant(kursant);
		testyWyniki.setPt(punkty);

		getTestyWynikiMdt().makePersistent(testyWyniki);

		// wysłanie ilości punktów
		setText(String.valueOf(punkty));

		return TEXT_RESULT;
	}

	private int obliczIlePtZdobyl(JsonArray jarray, List<Test> bazaOdp) {
		int punkty = 0;
		int iloscOdp = jarray.size();
		for (int i = 0; i < iloscOdp; i++) {
			JsonObject jobject = jarray.get(i).getAsJsonObject();
			boolean resultA = jobject.get("a").getAsBoolean();
			boolean resultB = jobject.get("b").getAsBoolean();
			boolean resultC = jobject.get("c").getAsBoolean();
			// get string as "KOD" e.g. "Z001"
			String resultKod = jobject.get("kod").toString();
			// get string as KOD e.g. Z001
			resultKod = resultKod.substring(1, resultKod.length() - 1);

			for (int j = 0; j < bazaOdp.size(); j++) {
				Test bOdp = bazaOdp.get(j);
				// dla jednego pytania
				if (bOdp.getKod().equals(resultKod)) {
					int iloscUdzielanychOdp = 0;
					int iloscBOdp = bOdp.getOdp().length();
					boolean odpA = false;
					boolean odpB = false;
					boolean odpC = false;

					for (int ch = 0; ch < iloscBOdp; ch++) {
						String nameOdp = bOdp.getOdp().substring(ch, ch + 1);
						if (nameOdp.equals("a")) {
							odpA = true;
							if (resultA == odpA) {
								iloscUdzielanychOdp++;
							}
						}
						if (nameOdp.equals("b")) {
							odpB = true;
							if (resultB == odpB) {
								iloscUdzielanychOdp++;
							}
						}
						if (nameOdp.equals("c")) {
							odpC = true;
							if (resultC == odpC) {
								iloscUdzielanychOdp++;
							}
						}

					}

					if (iloscUdzielanychOdp == iloscBOdp) {
						punkty++;
					}

					break;
				}
			}

		}

		return punkty;
	}

	private TestMdt getTestMdt() {
		if (testMdt == null)
			testMdt = new TestMdt();
		return testMdt;
	}

	private TestyWynikiMdt getTestyWynikiMdt() {
		if (testyWynikiMdt == null)
			testyWynikiMdt = new TestyWynikiMdt();
		return testyWynikiMdt;
	}

	public TestForm getForm() {
		if (form == null)
			form = new TestForm();
		return form;
	}

	public void setForm(TestForm form) {
		this.form = form;
	}

	public String getJsonOdp() {
		return jsonOdp;
	}

	public void setJsonOdp(String jsonOdp) {
		this.jsonOdp = jsonOdp;
	}

}
